package com.albaba.designpattern.interpreter.text_001;

import java.util.Deque;
import java.util.LinkedList;

/**
 * @Description: 表达式解释器
 * @Author zx
 * @Date 2025/2/28 14:29
 * @Version 1.0
 */
public class ExpressionInterpreter {

    // Deque双向队列，可以从队列两端增加或删除元素
    private Deque<Long> numbers = new LinkedList<Long>();

    // 接收表达式进行解析
    public long interpret(String expression) {

        String[] elements = expression.split(" ");
        int length = elements.length;
        // 获取表达式中的数字
        for (int i = 0; i < (length + 1) / 2; i++) {

            // 向集合的尾部添加元素
            numbers.addLast(Long.parseLong(elements[i]));

        }

        // 获取表达式中的符号，进行计算
        for (int i = 0; i < (length + 1) / 2; i++) {
            String operator = elements[i];
            // 符号必须是 + - * /，否则抛出异常
            boolean isValid = "+".equals(operator) ||
                    "-".equals(operator) ||
                    "*".equals(operator) ||
                    "/".equals(operator);

            if (!isValid) {
                throw new RuntimeException("表达式错误");
            }
            // 获取集合中的数字，移除集合中的第一个元素，并且返回被移除的值
            Long number1 = numbers.pollFirst();
            Long number2 = numbers.pollFirst();

            long result = 0;

            if ("+".equals(operator)) {
                result = number1 + number2;
            } else if ("-".equals(operator)) {
                result = number1 - number2;
            } else if ("*".equals(operator)) {
                result = number1 * number2;
            } else if ("/".equals(operator)) {
                result = number1 / number2;
            }
            // 将运算结果添加到集合的头部
            numbers.addFirst(result);
        }

        // 运算的最终结果是被保存在集合中的
        if (numbers.size() != 1) {
            throw new RuntimeException("表达式错误");
        }
        return numbers.pollFirst();
    }

}
